home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Guided Tour of Multimedia (Second Edition)
/
The Guided Tour of Multimedia (Second Edition).iso
/
trials
/
qtw111
/
samples
/
mathcomp.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-16
|
19KB
|
545 lines
// ---------------------------------------------------------------------
//
// MathComp.cpp - Math Components - QuickTime for Windows
//
// Version 1.0
//
// (c) 1988-1993 Apple Computer, Inc. All Rights Reserved.
//
// ---------------------------------------------------------------------
// Includes
// --------
#include <windows.h>
#include <windowsx.h>
#include <qtw.h>
#include <compmgr.h>
#include "mathcomp.h"
// No name decoration from C++
// ---------------------------
#ifdef __cplusplus
extern "C" {
#endif
// Function Selectors
// ------------------
// Add Component
#define fsAdd 0
// Sum Component
#define fsSum 0
#define fsSetSum 1
#define fsGetGlobalSum 2
#define fsSetGlobalSum 3
// Definitions
// -----------
#define ADD_VERSION 0x01000000
#define SUM_VERSION 0x01000000
// Typedefs
// --------
typedef struct tagSHARED {
short sTotal;
} SHARED, FAR *LPSHARED;
typedef struct tagPRIVATE {
short sTotal;
LPSHARED lpShared;
} PRIVATE, FAR *LPPRIVATE;
////////////////////////////////////////////////////////////////////////////
// Component Manager Interface Section
//
// Glue code pointers from QTW.LIB
// -------------------------------
extern ENTRYFUNC lpfnQTToolbox;
extern ENTRYFUNC lpfnQTComponentManager;
// Internal Function Declarations
// ------------------------------
VOID FAR PASCAL FixupTB (ENTRYFUNC lpfnTB);
VOID FAR PASCAL FixupCM (ENTRYFUNC lpfnCM);
// Prototypes of ASM entry point functions
// ---------------------------------------
DWORD FAR CDECL AddEntryPoint (VOID);
DWORD FAR CDECL SumEntryPoint (VOID);
// Data structure defining components in this DLL
// ----------------------------------------------
ComponentDescription cdTable [2] = // Number of components
{
{
QTFOURCC ('a','d','d','2'), // ostypeComponentType
QTFOURCC ('s','h','r','t'), // ostypeComponentSubType
QTFOURCC ('a','p','p','l'), // ostypeComponentManufacturer
0, // dwComponentFlags
0, // dwComponentFlagsMask
(ComponentRoutine) AddEntryPoint, // crEntryPoint
0, // hrsrcName
0, // hrsrcInfo
0 // hrsrcIcon
},
{
QTFOURCC ('s','u','m',' '), // ostypeComponentType
QTFOURCC ('s','h','r','t'), // ostypeComponentSubType
QTFOURCC ('a','p','p','l'), // ostypeComponentManufacturer
0, // dwComponentFlags
0, // dwComponentFlagsMask
(ComponentRoutine) SumEntryPoint, // crEntryPoint
0, // hrsrcName
0, // hrsrcInfo
0 // hrsrcIcon
}
};
// Function: THNGIDENTIFY - Required routine for components
// --------------------------------------------------------------------
// Parameters: LPCID FAR *lplpcid pointer to LPCID
//
// Returns: 'thng' constant
// --------------------------------------------------------------------
OSType FAR PASCAL THNGIDENTIFY (LPCID FAR *lplpcid) {
HGLOBAL hmem;
LPCID lpcid;
// Allocate memory to store CID info (will be freed by Component Manager)
if ((hmem = GlobalAlloc (GHND, sizeof CID)) == NULL)
return 0;
if ((lpcid = (LPCID) GlobalLock (hmem)) == NULL) {
GlobalFree (hmem);
return 0;
}
// Fill table
lpcid->lVersion = CID_VERSION; // Version of CompMgr interface
lpcid->sComponentCount = 2; // Number of components this DLL
lpcid->lpcdTable = (LPCD) &cdTable; // Component Table
lpcid->lpfnTBFixup = FixupTB; // Quick fixup routine for Toolbox
lpcid->lpfnCMFixup = FixupCM; // Quick fixup routine for CompMgr
*lplpcid = lpcid; // Store the pointer
return THING; // 'thng' identifies component
}
// Function: FixupTB - Set glue ToolBox pointer to given value
// --------------------------------------------------------------------
// Parameters: ENTRYFUNC lpfnTB pointer to ToolBox entry point
//
// Returns: VOID
// --------------------------------------------------------------------
VOID FAR PASCAL FixupTB (ENTRYFUNC lpfnTB) {
lpfnQTToolbox = lpfnTB;
return;
}
// Function: FixupCM - Set glue Component Manager pointer to given value
// --------------------------------------------------------------------
// Parameters: ENTRYFUNC lpfnCM pointer to CompMgr entry point
//
// Returns: VOID
// --------------------------------------------------------------------
VOID FAR PASCAL FixupCM (ENTRYFUNC lpfnCM) {
lpfnQTComponentManager = lpfnCM;
return;
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// COMPONENT: add2 shrt - Add two 16-bit (short) values
//
// Function: cfAddOpenSelect - Open an add component instance
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfAddOpenSelect (STKOFF_CMP so, ComponentInstance ci) {
return noErr;
}
// Function: cfAddCloseSelect - Close an open component instance
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfAddCloseSelect (STKOFF_CMP so, ComponentInstance ci) {
return noErr;
}
// Function: cfAddCanDoSelect - Report if function is implemented
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// LONG lFunctionSelector; function selector
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfAddCanDoSelect (STKOFF_CMP so, LONG lFunctionSelector) {
switch (lFunctionSelector) {
case kComponentOpenSelect:
case kComponentCloseSelect:
case kComponentCanDoSelect:
case kComponentVersionSelect:
case kComponentRegisterSelect:
case kComponentTargetSelect:
case fsAdd:
return TRUE;
default:
return FALSE;
}
}
// Function: cfAddVersionSelect - Report component version
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfAddVersionSelect (STKOFF_CMP so, ComponentInstance ci) {
return ADD_VERSION;
}
// Function: cfAddRegisterSelect - Report if able to register
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfAddRegisterSelect (STKOFF_CMP so, ComponentInstance ci) {
return 0;
}
// Function: cfAddTargetSelect - Not implemented
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfAddTargetSelect (STKOFF_CMP so, ComponentInstance ci) {
return 0;
}
////////////////////////////////////////////////////////////////////////////
// Add2 Functions
//
// Function: cfAdd2 - Add two short values
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// LPVOID lpvStorage; pointer to instance storage
// short sOne; first value to add
// short wTwo; second value to add
//
// Returns: short sum of two given values
// --------------------------------------------------------------------
short QTAPI cfAdd2 (STKOFF_CMP so, LPVOID lpvStorage, short sOne, short sTwo) {
return sOne + sTwo;
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// COMPONENT: sum shrt - Sum 16-bit (short) values
//
// Function: cfSumOpenSelect - Open a sum component instance
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfSumOpenSelect (STKOFF_CMP so, ComponentInstance ci) {
// Allocate private storage for this instance
LPPRIVATE lpPrivate;
if ((lpPrivate = (LPPRIVATE) GlobalAllocPtr (GHND, sizeof LPPRIVATE)) == NULL )
return insufficientMemory;
// Inform Component Manager of allocated storage for this instance
SetComponentInstanceStorage (ci, (LPVOID) lpPrivate);
// If this is the first instance allocate shared memory
LPSHARED lpShared;
if ((lpShared = (LPSHARED) GetComponentRefcon ((Component) ci)) == NULL) {
if ((lpShared = (LPSHARED) GlobalAllocPtr (GHND, sizeof LPSHARED)) == NULL) {
GlobalFreePtr (lpPrivate);
return insufficientMemory;
}
SetComponentRefcon ((Component) ci, (LONG) lpShared);
}
// Provide quick access to the shared memory
lpPrivate->lpShared = lpShared;
return noErr;
}
// Function: cfSumCloseSelect - Close an open component instance
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfSumCloseSelect (STKOFF_CMP so, ComponentInstance ci) {
// Get the private memory pointer
LPPRIVATE lpPrivate;
lpPrivate = (LPPRIVATE) GetComponentInstanceStorage (ci);
// Free shared memory if closing last instance
if (CountComponentInstances ((Component) ci) == 1) {
if (lpPrivate)
GlobalFreePtr (lpPrivate->lpShared);
// Prepare for next re-open
SetComponentRefcon ((Component) ci, 0);
}
// Free private instance memory
GlobalFreePtr (lpPrivate);
return noErr;
}
// Function: cfSumCanDoSelect - Report if function is implemented
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// LONG lFunctionSelector; function selector
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfSumCanDoSelect (STKOFF_CMP so, LONG lFunctionSelector) {
switch (lFunctionSelector) {
case kComponentOpenSelect:
case kComponentCloseSelect:
case kComponentCanDoSelect:
case kComponentVersionSelect:
case kComponentRegisterSelect:
case kComponentTargetSelect:
case fsSum:
case fsSetSum:
case fsGetGlobalSum:
case fsSetGlobalSum:
return TRUE;
default:
return FALSE;
}
}
// Function: cfSumVersionSelect - Report component version
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfSumVersionSelect (STKOFF_CMP so, ComponentInstance ci) {
return SUM_VERSION;
}
// Function: cfSumRegisterSelect - Report if able to register
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfSumRegisterSelect (STKOFF_CMP so, ComponentInstance ci) {
return 0;
}
// Function: cfSumTargetSelect - Not implemented
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// ComponentInstance ci; component instance handle
//
// Returns: ComponentResult
// --------------------------------------------------------------------
ComponentResult QTAPI cfSumTargetSelect (STKOFF_CMP so, ComponentInstance ci) {
return 0;
}
////////////////////////////////////////////////////////////////////////////
// Sum Functions
//
// Function: cfSum - Add given value to running total
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// LPVOID lpvStorage; pointer to instance storage
// short sOne; first short to add
// short wTwo; second short to add
//
// Returns: short instance total
// --------------------------------------------------------------------
short QTAPI cfSum (STKOFF_CMP so, LPVOID lpvStorage, short sValue) {
LPPRIVATE lpPrivate = (LPPRIVATE) lpvStorage;
// Add the given value into instance total
lpPrivate->sTotal += sValue;
// Add the given value into global total
lpPrivate->lpShared->sTotal += sValue;
// Return the instance total
return lpPrivate->sTotal;
}
// Function: cfSetSum - Set instance total to given value
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// LPVOID lpvStorage; pointer to instance storage
// short sValue; value to set
//
// Returns: short instance total after set
// --------------------------------------------------------------------
short QTAPI cfSetSum (STKOFF_CMP so, LPVOID lpvStorage, short sValue) {
LPPRIVATE lpPrivate = (LPPRIVATE) lpvStorage;
// Set the given value into instance total
lpPrivate->sTotal = sValue;
// Return the instance total
return lpPrivate->sTotal;
}
// Function: cfSetGlobalSum - Set global total to given value
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// LPVOID lpvStorage; pointer to instance storage
// short sValue; value to set
//
// Returns: short global total after set
// --------------------------------------------------------------------
short QTAPI cfSetGlobalSum (STKOFF_CMP so, LPVOID lpvStorage, short sValue) {
LPPRIVATE lpPrivate = (LPPRIVATE) lpvStorage;
// Set the given value into global total
lpPrivate->lpShared->sTotal = sValue;
// Return the global total
return lpPrivate->lpShared->sTotal;
}
// Function: cfGetGlobalSum - Return the global total
// --------------------------------------------------------------------
// Parameters: STKOFF_CMP so; component stack offset to parms
// LPVOID lpvStorage; pointer to instance storage
//
// Returns: short global total
// --------------------------------------------------------------------
short QTAPI cfGetGlobalSum (STKOFF_CMP so, LPVOID lpvStorage) {
LPPRIVATE lpPrivate = (LPPRIVATE) lpvStorage;
// Return the global total
return lpPrivate->lpShared->sTotal;
}
#ifdef __cplusplus
} // extern "C"
#endif
////////////////////////////////////////////////////////////////////////////
// Standard Windows DLL interface functions
//
// Function: LibMain - DLL initialization routine called by Windows
// --------------------------------------------------------------------
// Parameters: HANDLE hInstance; DLL instance handle
// WORD wDataSegment; Value of DS register
// WORD wHeapSize; Heap size
// LPSTR lpszCmdLine; Command line info
//
// Returns: TRUE if initialization successful; FALSE otherwise
// --------------------------------------------------------------------
int FAR PASCAL LibMain (HINSTANCE hInstance, WORD wDataSegment,
WORD wHeapSize, LPSTR lpszCmdLine) {
// Unlock the current movable data segment
if (wHeapSize > 0)
UnlockData (0);
// Return to Windows
return TRUE;
}
// Function: WEP - Windows exit procedure
// --------------------------------------------------------------------
// Parameters: int nExitType Exit type
//
// Returns: Always 1
// --------------------------------------------------------------------
extern "C" BOOL FAR PASCAL WEP (int nValue);
#pragma alloc_text(WEP_TEXT,WEP)
extern "C" BOOL FAR PASCAL WEP (int nValue) {
return TRUE;
}